package org.epanetgrid.otimizacao;

import java.util.Timer;
import java.util.TimerTask;

import org.jheuristics.ga.Evolver;
import org.jheuristics.util.Condition;

/**
 * Otimizador al�m da condi��o de parada passada como par�metro, contem 
 * o tempo m�ximo que o otimizador deve executar
 * @author vinicius
 *
 */
public class OtimizadorTemporal extends OtimizadorNaoTemporal {
	private long tempoLimite;
	private Timer timer;
	private OtimizadorTemporal myself;

	/**
	 *
	 * @param evolver Evolver a ser utilizado pelo otimizador
	 * @param condition Condi��o de parada
	 * @param tempoLimite Tempo m�ximo de execu��o
	 */
	public OtimizadorTemporal(Evolver evolver, Condition condition, long tempoLimite) {
		super(evolver, condition);
		setTempoLimite(tempoLimite);
		myself = this;
	}

	/*
	 * (non-Javadoc)
	 * @see org.smartpumping.otimizacao.OtimizadorObservable#start()
	 */
	public void start() {
		if (0 < getTempoLimite()) {
			timer = new Timer();
			timer.schedule(new TimerTask() {
				public void run() {
					notifyObservers(new OtimizadorEventObject(myself, timer, OtimizadorEvent.TEMPO_LIMITE));
					stop();
				}
			}, getTempoLimite());
		}
		super.start();
	}

	/*
	 * (non-Javadoc)
	 * @see org.smartpumping.otimizacao.OtimizadorObservable#stop()
	 */
	public void stop() {
		timer.cancel();
		super.stop();
	}

	/*
	 * 
	 */
	public long getTempoLimite() {
		return tempoLimite;
	}

	/**
	 * 
	 * @param tempoLimite
	 */
	public void setTempoLimite(long tempoLimite) {
		this.tempoLimite = tempoLimite;
	}

	/**
	 * 
	 * @return
	 */
	protected Timer getTimer() {
		return timer;
	}

}
